很多人記了帳卻看不懂自己的花錢習慣。今天的目標很單純:把表格變成圖表。只要你有 expense.csv(Day16 建的那個),直接執行就能看到結果;若你還沒有檔案,程式會自動幫你產生示範資料。
import os
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'Heiti TC'
# 1) 讀檔;若找不到 expense.csv,就自動建立一份示範資料
csv_path = "expense.csv"
if not os.path.exists(csv_path):
demo = pd.DataFrame({
"日期": [
"2025-07-28","2025-07-29","2025-07-30",
"2025-08-01","2025-08-01","2025-08-02","2025-08-02",
"2025-08-03","2025-08-04","2025-08-05","2025-08-06"
],
"品項": ["早餐","午餐","捷運","早餐","咖啡","午餐","購物","晚餐","早餐","醫療","捷運"],
"金額": [60,120,30,65,75,130,1200,180,55,500,30]
})
demo.to_csv(csv_path, index=False)
print("未找到 expense.csv,已建立示範資料。")
# 2) 讀取資料與基本清理
df = pd.read_csv(csv_path)
# 確保欄位存在
required_cols = {"日期","品項","金額"}
if not required_cols.issubset(df.columns):
raise ValueError(f"檔案需要包含欄位:{required_cols}")
# 轉日期、確保金額是數字
df["日期"] = pd.to_datetime(df["日期"], errors="coerce")
df["金額"] = pd.to_numeric(df["金額"], errors="coerce")
df = df.dropna(subset=["日期","金額"])
# 3) 依品項加總 → 圓餅圖(支出結構)
cat_sum = df.groupby("品項")["金額"].sum().sort_values(ascending=False)
plt.figure(figsize=(6,6))
# autopct 會顯示百分比;startangle=90 讓第一塊從正上方開始
cat_sum.plot(kind="pie", autopct="%1.1f%%", startangle=90, counterclock=False)
plt.title("各品項支出佔比")
plt.ylabel("") # 隱藏預設的 y 標籤
plt.tight_layout()
plt.show()
# 4) 依月份加總 → 長條圖(支出趨勢)
df["月份"] = df["日期"].dt.to_period("M").astype(str)
mon_sum = df.groupby("月份")["金額"].sum()
plt.figure(figsize=(8,4))
mon_sum.plot(kind="bar")
plt.title("每月總支出")
plt.xlabel("月份")
plt.ylabel("金額(元)")
plt.tight_layout()
plt.show()
# 5) 小摘要:Top 3 支出類別
print("=== Top 3 支出類別 ===")
print(cat_sum.head(3))
風險與隱私提醒:若使用真實帳單,請先移除/遮蔽個資(卡號、姓名、地址);個人檔案避免上傳到公開空間。